#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>

#define SERVER_IP "192.168.31.13"
#define SERVER_PORT 50000

int main(int argc, char const *argv[])
{
    int sockfd = socket( AF_INET, SOCK_STREAM, 0 );
    if ( -1 == sockfd )
    {
        perror( "fail socket" );
        return -1;
    }

    struct sockaddr_in siServer;
    siServer.sin_family = AF_INET;
    siServer.sin_port   = htons( SERVER_PORT );
    siServer.sin_addr.s_addr = inet_addr( SERVER_IP );
    
    int iRet;
    iRet = connect( sockfd, (struct sockaddr *)&siServer, sizeof(siServer) );
    if ( -1 == iRet )
    {
        perror( "fail connect" );
        return -1;
    }

    char strBuff[100] = "Hello first TCP";
    ssize_t szRet;
    szRet = send( sockfd, strBuff, strlen(strBuff) + 1, 0 );
    printf( "send #%ld bytes\n", szRet );

    memset( strBuff, 0, sizeof(strBuff) );
    szRet = recv( sockfd, strBuff, sizeof(strBuff), 0 );
    printf( "Recv #%ld bytes: %s\n", szRet, strBuff );

    close( sockfd );

    return 0;
}

/*
程序功能
    给指定的 TCP 服务器发送一个字符串. ( Linux 的程序作为 TCP服务器)
    接收 TCP服务器 发送的数据.

程序流程
    向TCP服务器发起并建立连接
    向服务器发送数据
    从服务器接收回应
    关闭连接

涉及函数
    socket
    connect
        htons
        inet_addr
    send
    close

知识要点
    TCP客户端的原子操作

测试流程
    02_tcp_clint.c  作为客户端, 设定 TCP服务器的 IP 和 端口 宏定义
    03_tcp_server.c 作为服务器, 设定 TCP服务器的 IP 和 端口 宏定义
    先运行服务器, 再运行客户端
*/
